import static org.junit.Assert.*;
import org.junit.*;
import static org.hamcrest.CoreMatchers.*;

public class RunTest {

	@Test
	public void teststore() { //Store 함수가 잘 돌아가는지 테스트		
		ContactCollection contact = new ContactCollection();
		contact.Store("기용", "이");		
		assertTrue(contact.searchFname().equals("기용"));
		assertTrue(contact.searchLname().equals("이"));
	}
	
	@Test
	public void testloadPW() {//저장된 패스워드 잘 불러오나 테스트
		ContactCollection contact = new ContactCollection();
		contact.loadPW();
	    String password = contact.GetPW();
		assertNotNull(password);
	}
	
	@Test
	public void testinitPW() {//초기 비밀번호가 000000인지 테스트 (test 하기전에 000000으로 비번 바꾸기)
		ContactCollection contact = new ContactCollection();
		contact.loadPW();
	    String password = contact.GetPW();
		assertEquals(password, "000000");
	}

	@Test
	public void testisPW() {//현재 비밀번호와 다른 값을 입력했을 때 잘못된 번호를 입력했다는 걸 판단하는지 테스트 (현재 비번 + 1이면 무조건 틀린 비번이므로)
		ContactCollection contact = new ContactCollection();
		assertFalse (contact.IdentifyPW(contact.GetPW()+"1"));
	}	
	
	@Test
	public void testmodPW() {//비밀번호 바꾸었을 때 잘 적용되는지 테스트
		ContactCollection contact = new ContactCollection();
		contact.SetPW2("tidlsl");
		assertTrue (contact.IdentifyPW("tidlsl"));
	}
	
	@Test
	public void testmodPW2() {//비밀번호 수정시 6자리 미만의 값으로 주었을 때 비밀번호가 안바뀌는지 테스트
		ContactCollection contact = new ContactCollection();
		contact.loadPW();
		String oldpassword = contact.GetPW();
		contact.SetPW2("1234");
		assertFalse(contact.IdentifyPW("1234"));
		assertTrue (contact.IdentifyPW(oldpassword));
	}
	
	@Test
	public void testadddata() {//연락처를 추가했을 때 count값이 증가하는지 테스트
		ContactCollection contact = new ContactCollection();
		int oldcount = contact.getCount();
		contact.addContact("fname", "lname", "pos", "dept", "comp", "addr", "tel", "fax", "mobile", "mail", "homepg");		
		int newcount = contact.getCount();
		assertTrue(oldcount + 1 == newcount);
	}
	
	@Test
	public void testadddata2(){//연락처 추가시 배열 구성이 달라지는지 테스트
		ContactCollection contact = new ContactCollection();
		contact.loadCollection();
		String olddata = contact.allContacts();
		contact.addContact("아리", "이", "pos", "dept", "comp", "addr", "tel", "fax", "mobile", "mail", "homepg");		
		String newdata = contact.allContacts();
		assertThat(olddata, not(newdata));
	}
	
	@Test
	public void testadddata3() {//연락처 추가했을 때 내용이 제대로 들어가는지 테스트
		ContactCollection contact = new ContactCollection();		
		contact.addContact("fname", "lname", "pos", "dept", "comp", "addr", "02", "012", "010", "email", "homepg");
		assertTrue(contact.searchFname() == "fname");
		assertTrue(contact.searchLname () == "lname");
		assertTrue(contact.searchPos() == "pos");
		assertTrue(contact.searchDept() == "dept");
		assertTrue(contact.searchComp() == "comp");
		assertTrue(contact.searchAddr() == "addr");
		assertTrue(contact.searchTel() == "02");
		assertTrue(contact.searchFax() == "012");
		assertTrue(contact.searchMobile() == "010");
		assertTrue(contact.searchEmail() == "email");
		assertTrue(contact.searchHomepg() == "homepg");
	}
	
	@Test
	public void testfind() {//검색했을 때 findcontact의 리턴값 1이아니라 0인지 확인. 못찾으면 저장되어있는 개수: 1, 찾으면 해당 인덱스: 0		
		ContactCollection contact = new ContactCollection();
		contact.addContact("fname", "lname", "pos", "dept", "comp", "addr", "02", "012", "010", "email", "homepg");
		assertTrue(contact.findContact("fname", "lname") == 0);
	}
	
	@Test
	public void testnotfound() {//없는 이름 검색했을 때 findcontact 리턴값이 3(=count)이 맞는지 테스트		
		ContactCollection contact = new ContactCollection();
		contact.addContact("fname", "lname", "pos", "dept", "comp", "addr", "02", "012", "010", "email", "homepg");
		contact.addContact("na", "do", "a", "b", "c", "d", "024", "015", "04410", "e", "f");
		contact.addContact("f", "ln", "posq", "deptq", "compq", "adqdr", "044", "33", "44", "emailq", "homepgq");
		assertTrue(contact.findContact("없는", "이름") == 3);
	}
	
	@Test
	public void testsortdata(){//이름 순으로 잘 정렬 되는지(sort함수가 잘 돌아가는지), (add함수가 sort함수를 호출하기 때문에 add했을 때 정렬이 잘되면 sort함수가 잘 돌아가는 것임) 
			ContactCollection contact = new ContactCollection();
			contact.addContact("fname", "lname", "pos", "dept", "comp", "addr", "02", "012", "010", "email", "homepg");
			contact.addContact("fnames", "lnames", "posa", "depta", "compa", "addra", "023", "0123", "0102", "emaila", "homepga");
			contact.addContact("na", "do", "a", "b", "c", "d", "024", "015", "04410", "e", "f");
			contact.addContact("f", "ln", "posq", "deptq", "compq", "adqdr", "044", "33", "44", "emailq", "homepgq");
			contact.addContact("fna", "lme", "wpos", "wdept", "wcomp", "waddr", "302", "3012", "3010", "wemail", "whomepg");
			contact.search("fn");			
			String str = " name : lme  fna    mobile : 3010";
			String str1 = " name : lname  fname    mobile : 010";
			String str2 = " name : lnames  fnames    mobile : 0102";
			assertEquals(str,contact.Searchlist(0));
			assertEquals(str1,contact.Searchlist(1));
			assertEquals(str2,contact.Searchlist(2));
	}
	
	@Test
	public void testmoddata() {//연락처를 수정했을 때 count값에는 변화가 없는 것을 확인하는 테스트
		ContactCollection contact = new ContactCollection();
		contact.addContact("fname", "lname", "pos", "dept", "comp", "addr", "tel", "fax", "mobile", "mail", "homepg");
		int oldcount = contact.getCount();			
		contact.modifyContact("mfname", "mlname", "mpos", "mdept", "mcomp", "maddr", "mtel", "mfax", "mmobile", "mmail", "mhomepg");
		int newcount = contact.getCount();
		assertTrue(oldcount == newcount);
	}
	
	@Test
	public void testmoddata2() {//연락처 수정시 제대로 수정되는지 테스트
		ContactCollection contact = new ContactCollection();
		contact.addContact("fname", "lname", "pos", "dept", "comp", "addr", "tel", "fax", "mobile", "mail", "homepg");			
		contact.modifyContact("mfname", "mlname", "mpos", "mdept", "mcomp", "maddr", "mtel", "mfax", "mmobile", "mmail", "mhomepg");	
		assertTrue("mfname" == contact.searchFname() && "mlname" == contact.searchLname() && "mpos" == contact.searchPos() 
				&& "mdept" == contact.searchDept() && "mcomp" == contact.searchComp() && "maddr" == contact.searchAddr() 
				&& "mtel" == contact.searchTel() && "mfax" == contact.searchFax() && "mmobile" == contact.searchMobile() 
				&& "mmail" == contact.searchEmail() && "mhomepg" == contact.searchHomepg());
	}
	
	@Test
	public void testmodsort(){//연락처 수정시 정렬이 제대로 다시 수행 되는지 테스트
		ContactCollection contact = new ContactCollection();
		contact.loadCollection();
		contact.addContact("하", "하", "pos", "dept", "comp", "addr", "tel", "fax", "mobile", "mail", "homepg");
		String olddata = contact.allContacts();
		contact.modifyContact("이", "이", "pos", "dept", "comp", "addr", "tel", "fax", "mobile", "mail", "homepg");
		contact.sort();
		String newdata = contact.allContacts();	
		assertThat(olddata, not(newdata));//==assertNotEquals(olddata, newdata);
	}
	
	@Test
	public void testdeldata() {//연락처를 지웠을 때 count가 줄어드는지 테스트
		ContactCollection contact = new ContactCollection();
		contact.addContact("fname", "lname", "pos", "dept", "comp", "addr", "tel", "fax", "mobile", "mail", "homepg");
		int oldcount = contact.getCount();			
		contact.deleteContact();
		int newcount = contact.getCount();
		assertTrue(oldcount - 1 == newcount);
	}
	
	@Test
	public void testdeldata2() {//연락처를 지웠을 때 배열 구성이 변했는지 테스트
		ContactCollection contact = new ContactCollection();
		contact.loadCollection();	
		contact.addContact("아리", "이", "pos", "dept", "comp", "addr", "tel", "fax", "mobile", "mail", "homepg");
		String olddata = contact.allContacts();			
		contact.deleteContact();
		contact.sort();
		String newdata = contact.allContacts();	
		assertThat(olddata, not(newdata));
	}
	
	@Test
	public void testsearchdata() {//검색결과가 제대로 나오는지 테스트		
		ContactCollection contact = new ContactCollection();
		contact.addContact("fname", "lname", "pos", "dept", "comp", "addr", "02", "012", "010", "email", "homepg");
		contact.addContact("fnames", "lnames", "posa", "depta", "compa", "addra", "023", "0123", "0102", "emaila", "homepga");
		contact.addContact("na", "do", "a", "b", "c", "d", "024", "015", "04410", "e", "f");
		contact.addContact("f", "ln", "posq", "deptq", "compq", "adqdr", "044", "33", "44", "emailq", "homepgq");
		contact.addContact("fna", "lme", "wpos", "wdept", "wcomp", "waddr", "302", "3012", "3010", "wemail", "whomepg");
		contact.search("f");
		assertTrue(contact.getCount2() == 4);
		contact.search("fn");
		assertTrue(contact.getCount2() == 3);
		contact.search("on");
		assertTrue(contact.getCount2() == 1);
		contact.search("d");
		assertTrue(contact.getCount2() == 1);
		contact.search("es");
		assertTrue(contact.getCount2() == 1);
		contact.search("fname");
		assertTrue(contact.getCount2() == 2);
	}

	@Test
	public void testlist() {//list()메소드가 잘 수행되는지 테스트		
		ContactCollection contact = new ContactCollection();
		contact.addContact("fname", "lname", "pos", "dept", "comp", "addr", "02", "012", "010", "email", "homepg");
		String str = " name : lname  fname    mobile : 010";
		assertTrue(contact.list(0).equals(str));
	}
	
	@Test
	public void testsaveCollection() {//saveCollection 함수가 모든 연락정보를 파일에 저장할 형태로 제대로 반환하는지 테스트	
		ContactCollection contact = new ContactCollection();
		contact.addContact("fname", "lname", "pos", "dept", "comp", "addr", "02", "012", "010", "email", "homepg");		
		String str = "fname/lname/pos/dept/comp/addr/02/012/010/email/homepg\n";
		assertTrue(contact.saveCollection().equals(str));	
	}	
		
	@Test
	public void testsavedata(){//연락처를 추가하고 저장버튼 눌렀을 때 제대로 파일에 저장되는지 테스트
		ContactCollection contact = new ContactCollection();
		contact.loadCollection();
		String olddata = contact.allContacts();
		System.out.println(olddata);
		contact.addContact("현우", "이", "부사장", "총무부", "카페베네", "경기도 안양시 윤문정 옆 동네", "031-5884-4860", 
				            "031-231", "010-8473-8872", "hyunwoo@nate.com", "931004.co.kr");		
		contact.savedata();		
		ContactCollection contact2 = new ContactCollection();
		contact2.loadCollection();
		String newdata = contact2.allContacts();
		System.out.println(newdata);
		assertThat(olddata, not(newdata));
	}

	@Test
	public void testloaddata() {//저장된 연락처들을 잘 불러오는지 테스트
		ContactCollection contact = new ContactCollection();
		contact.loadCollection();
		String data = contact.allContacts();
		assertNotNull(data);
	}
}
